/*
* Copyright 2010 FatWire Corporation. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.fatwire.gst.foundation.url.db;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import COM.FutureTense.Interfaces.ICS;
import COM.FutureTense.Util.ftMessage;
import com.fatwire.assetapi.data.AssetId;
import com.fatwire.cs.core.db.PreparedStmt;
import com.fatwire.cs.core.db.StatementParam;
import com.fatwire.gst.foundation.facade.cm.AddRow;
import com.fatwire.gst.foundation.facade.cm.ReplaceRow;
import com.fatwire.gst.foundation.facade.sql.Row;
import com.fatwire.gst.foundation.facade.sql.SqlHelper;
import com.fatwire.gst.foundation.facade.sql.table.TableColumn.Type;
import com.fatwire.gst.foundation.facade.sql.table.TableCreator;
import com.fatwire.gst.foundation.facade.sql.table.TableDef;
import com.fatwire.gst.foundation.vwebroot.VirtualWebroot;
import com.fatwire.gst.foundation.wra.SimpleWra;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* WraPathTranslationService that is backed by the GSTUrlRegistry table.
*
* @author Dolf Dijkstra
* @since November 1, 2011
*
* @deprecated as of release 12.x, replace with WCS 12c's native vanity URLs support.
*
*/
@Deprecated
public class UrlRegistryDaoImpl implements UrlRegistryDao {
private static final String OPT_SITE = "opt_site";
private static final String OPT_URL_PATH = "opt_url_path";
private static final String OPT_VWEBROOT = "opt_vwebroot";
private static final String OPT_DEPTH = "opt_depth";
private static final String ENDDATE = "enddate";
private static final String STARTDATE = "startdate";
private static final String PATH = "path";
private static final String ASSETTYPE = "assettype";
private static final String ASSETID = "assetid";
private static final String ID = "id";
private static final Logger LOG = LoggerFactory.getLogger("tools.gsf.legacy.url.db.UrlRegistryDaoImpl");
private final ICS ics;
private static final String URLREG_TABLE = "GSTUrlRegistry";
public static String TABLE_ACL_LIST = ""; // no ACLs because events are
// anonymous
public UrlRegistryDaoImpl(final ICS ics) {
this.ics = ics;
}
public void install() {
final TableDef def = new TableDef(URLREG_TABLE, TABLE_ACL_LIST, ftMessage.objecttbl);
def.addColumn(ID, Type.ccbigint, true).setNullable(false);
def.addColumn(PATH, Type.ccvarchar).setLength(4000).setNullable(false);
def.addColumn(ASSETTYPE, Type.ccvarchar).setLength(255).setNullable(false);
def.addColumn(ASSETID, Type.ccbigint).setNullable(false);
def.addColumn(STARTDATE, Type.ccdatetime).setNullable(true);
def.addColumn(ENDDATE, Type.ccdatetime).setNullable(true);
def.addColumn(OPT_VWEBROOT, Type.ccvarchar).setLength(255).setNullable(true);
def.addColumn(OPT_URL_PATH, Type.ccvarchar).setLength(4000).setNullable(true);
def.addColumn(OPT_DEPTH, Type.ccinteger).setNullable(true);
def.addColumn(OPT_SITE, Type.ccvarchar).setLength(255).setNullable(true);
new TableCreator(ics).createTable(def);
}
public boolean isInstalled() {
return SqlHelper.tableExists(ics, URLREG_TABLE);
}
private static final PreparedStmt REGISTRY_SELECT = new PreparedStmt("SELECT * FROM " + URLREG_TABLE
+ " WHERE opt_vwebroot=? AND opt_url_path=? ORDER BY startdate,enddate",
Collections.singletonList(URLREG_TABLE));
private static final PreparedStmt REGISTRY_SELECT_ID = new PreparedStmt("SELECT * FROM " + URLREG_TABLE
+ " WHERE assettype=? AND assetid=?", Collections.singletonList(URLREG_TABLE));
static {
REGISTRY_SELECT.setElement(0, URLREG_TABLE, OPT_VWEBROOT);
REGISTRY_SELECT.setElement(1, URLREG_TABLE, OPT_URL_PATH);
REGISTRY_SELECT_ID.setElement(0, URLREG_TABLE, ASSETTYPE);
REGISTRY_SELECT_ID.setElement(1, URLREG_TABLE, ASSETID);
}
@Override
public List<VanityUrl> resolveAsset(final String virtual_webroot, final String url_path) {
final StatementParam param = REGISTRY_SELECT.newParam();
param.setString(0, virtual_webroot);
param.setString(1, url_path);
final List<VanityUrl> l = new LinkedList<VanityUrl>();
for (final Row row : SqlHelper.select(ics, REGISTRY_SELECT, param)) {
final VanityUrl url = new VanityUrl();
url.setId(row.getLong(ID));
url.setAssetid(row.getLong(ASSETID));
url.setAssettype(row.getString(ASSETTYPE));
url.setPath(row.getString(PATH));
url.setStartdate(row.getDate(STARTDATE));
url.setEnddate(row.getDate(ENDDATE));
url.setOpt_depth(Integer.parseInt(row.getString(OPT_DEPTH)));
url.setOpt_vwebroot(row.getString(OPT_VWEBROOT));
url.setOpt_url_path(row.getString(OPT_URL_PATH));
url.setOpt_site(row.getString(OPT_SITE));
l.add(url);
}
return l;
}
@Override
public void add(final SimpleWra wra, final VirtualWebroot vw, final String site) {
if (LOG.isTraceEnabled()) {
LOG.trace("addAsset(AssetId) called for asset " + wra);
}
final AssetId asset = wra.getId();
if (vw != null) {
final String vwebroot = vw.getEnvironmentVirtualWebroot();
final String urlpath = wra.getPath().substring(vw.getMasterVirtualWebroot().length());
final int depth = StringUtils.countMatches(urlpath, "/");
AddRow addRow = new AddRow(URLREG_TABLE);
addRow.set(ID, ics.genID(true));
addRow.set(PATH, wra.getPath());
addRow.set(ASSETTYPE, asset.getType());
addRow.set(ASSETID, Long.toString(asset.getId()));
addRow.set(STARTDATE, wra.getStartDate());
addRow.set(ENDDATE, wra.getEndDate());
addRow.set(OPT_VWEBROOT, vwebroot);
addRow.set(OPT_URL_PATH, urlpath);
addRow.set(OPT_DEPTH, Integer.toString(depth));
addRow.set(OPT_SITE, site);
addRow.execute(ics);
if (LOG.isDebugEnabled()) {
LOG.debug("Added WRA " + asset + " to url registry");
}
} else {
if (LOG.isTraceEnabled()) {
LOG.trace("Did not add WRA " + asset + " to url registry because no valid virtual webroot was found");
}
}
}
@Override
public void update(final VanityUrl url) {
final ReplaceRow u = new ReplaceRow(URLREG_TABLE);
u.set(ID, url.getId());
u.set(PATH, url.getPath());
u.set(ASSETTYPE, url.getAssettype());
u.set(ASSETID, url.getAssetid());
u.set(STARTDATE, url.getStartdate());
u.set(ENDDATE, url.getEnddate());
u.set(OPT_VWEBROOT, url.getOpt_vwebroot());
u.set(OPT_URL_PATH, url.getOpt_url_path());
u.set(OPT_DEPTH, url.getOpt_depth());
u.set(OPT_SITE, url.getOpt_site());
u.execute(ics);
}
@Override
public VanityUrl read(final AssetId id) {
final StatementParam param = REGISTRY_SELECT_ID.newParam();
param.setString(0, id.getType());
param.setLong(1, id.getId());
final Row row = SqlHelper.selectSingle(ics, REGISTRY_SELECT_ID, param);
if (row == null) {
return null;
}
final VanityUrl url = new VanityUrl();
url.setId(row.getLong(ID));
url.setAssetid(row.getLong(ASSETID));
url.setAssettype(row.getString(ASSETTYPE));
url.setPath(row.getString(PATH));
url.setStartdate(row.getDate(STARTDATE));
url.setEnddate(row.getDate(ENDDATE));
url.setOpt_depth(Integer.parseInt(row.getString(OPT_DEPTH)));
url.setOpt_vwebroot(row.getString(OPT_VWEBROOT));
url.setOpt_url_path(row.getString(OPT_URL_PATH));
url.setOpt_site(row.getString(OPT_SITE));
return url;
}
@Override
public void delete(final AssetId id) {
final StatementParam param = REGISTRY_SELECT_ID.newParam();
param.setString(0, id.getType());
param.setLong(1, id.getId());
final Row row = SqlHelper.selectSingle(ics, REGISTRY_SELECT_ID, param);
if (row != null) {
//only delete if a record is found to prevent trashing.
deleteAsset_(id);
}
}
private void deleteAsset_(final AssetId id) {
if (LOG.isTraceEnabled()) {
LOG.trace("Attempting to delete asset " + id + " from " + URLREG_TABLE);
}
SqlHelper.execute(ics, URLREG_TABLE, "DELETE FROM " + URLREG_TABLE + " WHERE assettype = '" + id.getType()
+ "' AND assetid = " + id.getId());
if (LOG.isDebugEnabled()) {
LOG.debug("Asset " + id + " is now removed from " + URLREG_TABLE);
}
}
public void clear() {
LOG.debug("Attempting to purge all rows from "+URLREG_TABLE);
SqlHelper.execute(ics, URLREG_TABLE, "DELETE FROM " + URLREG_TABLE);
LOG.info("Purged all rows from "+URLREG_TABLE);
}
}