/**
* personium.io
* Copyright 2014 FUJITSU LIMITED
*
* 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.fujitsu.dc.core.model.impl.es.odata;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.odata4j.core.OEntity;
import org.odata4j.core.OEntityKey;
import org.odata4j.edm.EdmDataServices;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fujitsu.dc.common.es.EsIndex;
import com.fujitsu.dc.common.es.response.DcGetResponse;
import com.fujitsu.dc.common.es.response.DcSearchHit;
import com.fujitsu.dc.core.auth.AccessContext;
import com.fujitsu.dc.core.model.Cell;
import com.fujitsu.dc.core.model.ModelFactory;
import com.fujitsu.dc.core.model.ctl.CtlSchema;
import com.fujitsu.dc.core.model.impl.es.EsModel;
import com.fujitsu.dc.core.model.impl.es.accessor.DataSourceAccessor;
import com.fujitsu.dc.core.model.impl.es.accessor.EntitySetAccessor;
import com.fujitsu.dc.core.model.impl.es.accessor.ODataLinkAccessor;
import com.fujitsu.dc.core.model.impl.es.cache.CellCache;
import com.fujitsu.dc.core.model.impl.es.doc.CellDocHandler;
import com.fujitsu.dc.core.model.impl.es.doc.EntitySetDocHandler;
import com.fujitsu.dc.core.model.impl.es.doc.OEntityDocHandler;
import com.fujitsu.dc.core.odata.OEntityWrapper;
/**
* ユニット制御のODataサービスむけODataProvider.
*/
public class UnitCtlODataProducer extends EsODataProducer {
static Logger log = LoggerFactory.getLogger(UnitCtlODataProducer.class);
AccessContext accesscontext;
/**
* Constructor.
* @param ac アクセスコンテキスト
*/
public UnitCtlODataProducer(AccessContext ac) {
this.accesscontext = ac;
}
// スキーマ情報
private static EdmDataServices.Builder edmDataServices = CtlSchema.getEdmDataServicesForUnitCtl();
/**
* Cell / オーナー情報 に基づいた暗黙フィルタの作成.
* @param entitySetName エンティティセット名
* @return Cell / オーナー情報 に基づいた暗黙フィルタ
*/
@Override
protected List<Map<String, Object>> getImplicitFilters(String entitySetName) {
List<Map<String, Object>> implicitFilters = new ArrayList<Map<String, Object>>();
// ユニットユーザトークン、ユニットローカルユニットユーザトークンだったらトークンのサブジェクトの値を検索条件に追加
if (AccessContext.TYPE_UNIT_USER.equals(this.accesscontext.getType())
|| AccessContext.TYPE_UNIT_LOCAL.equals(this.accesscontext.getType())) {
Map<String, Object> ownerAnd = new HashMap<String, Object>();
Map<String, Object> ownerTerm = new HashMap<String, Object>();
ownerAnd.put("term", ownerTerm);
ownerTerm.put(OEntityDocHandler.KEY_OWNER, this.accesscontext.getSubject());
implicitFilters.add(ownerAnd);
}
return implicitFilters;
}
@Override
public void afterCreate(final String entitySetName, final OEntity oEntity, final EntitySetDocHandler docHandler) {
if (!Cell.EDM_TYPE_NAME.equals(entitySetName)) {
return;
}
Cell cell = ModelFactory.cell(((OEntityWrapper) oEntity).getUuid(), null);
// Init Cell Cmp (create metadata if not exist.)
ModelFactory.cellCmp(cell);
}
/**
* 実装サブクラスProducer更新処理を行いたいときは、ここをoverrideして子データの存在チェックし、結果を返すよう実装する。
* @param entitySetName エンティティセット名
* @param oEntityKey 更新対象のエンティティキー
* @param docHandler 更新対象のエンティティドックハンドラ
*/
@Override
public void beforeUpdate(final String entitySetName,
final OEntityKey oEntityKey,
final EntitySetDocHandler docHandler) {
CellCache.clear(oEntityKey.asSingleValue().toString());
}
/**
* 実装サブクラスProducerが削除処理を行いたいときは、ここをoverrideして子データの存在チェックし、結果を返すよう実装する。
* @param entitySetName エンティティセット名
* @param oEntityKey 削除対象のエンティティキー
* @param docHandler 削除対象ドキュメント
*/
@Override
public void beforeDelete(final String entitySetName, final OEntityKey oEntityKey,
final EntitySetDocHandler docHandler) {
CellCache.clear(oEntityKey.asSingleValue().toString());
}
@Override
public DataSourceAccessor getAccessorForIndex(final String entitySetName) {
return null; // 必要時に実装すること
}
@Override
public EntitySetAccessor getAccessorForEntitySet(final String entitySetName) {
return EsModel.unitCtl(entitySetName, EsIndex.CELL_ROUTING_KEY_NAME);
}
@Override
public ODataLinkAccessor getAccessorForLink() {
return EsModel.unitCtlLink(EsIndex.CELL_ROUTING_KEY_NAME);
}
@Override
public DataSourceAccessor getAccessorForLog() {
return null;
}
@Override
public DataSourceAccessor getAccessorForBatch() {
return EsModel.batch();
}
@Override
public EdmDataServices getMetadata() {
return edmDataServices.build();
}
/**
* DocHandlerを取得する.
* @param searchHit 検索結果
* @param entitySetName エンティティセット名
* @return OEntityDocHandler
*/
@Override
protected EntitySetDocHandler getDocHandler(DcSearchHit searchHit, String entitySetName) {
return new CellDocHandler(searchHit);
}
/**
* DocHandlerを取得する.
* @param type elasticsearchのType
* @param oEntity OEntityWrapper
* @return OEntityDocHandler
*/
@Override
protected EntitySetDocHandler getDocHanlder(String type, OEntityWrapper oEntity) {
return new CellDocHandler(type, oEntity, getMetadata());
}
/**
* DocHandlerを取得する.
* @param response GetResponse
* @param entitySetName エンティティセット名
* @return OEntityDocHandler
*/
@Override
protected EntitySetDocHandler getDocHandler(DcGetResponse response, String entitySetName) {
return new CellDocHandler(response);
}
/**
* 不正なLink情報のチェックを行う.
* @param sourceEntity ソース側Entity
* @param targetEntity ターゲット側Entity
*/
@Override
protected void checkInvalidLinks(EntitySetDocHandler sourceEntity, EntitySetDocHandler targetEntity) {
}
/**
* 不正なLink情報のチェックを行う.
* @param sourceDocHandler ソース側Entity
* @param entity ターゲット側Entity
* @param targetEntitySetName ターゲットのEntitySet名
*/
@Override
protected void checkInvalidLinks(EntitySetDocHandler sourceDocHandler, OEntity entity, String targetEntitySetName) {
}
@Override
public void onChange(String entitySetName) {
}
}