/*
 * Copyright 2002-2008 the original author or authors.
 *
 * 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 integration.anyframe.services.query;

import integration.anyframe.services.AbstractTest;
import integration.anyframe.services.query.vo.CategoryVO;

import java.util.Collection;

import anyframe.core.query.IQueryService;

public class QueryServiceTestNamedParamVO extends AbstractTest {

	/**
	 * 테스트 수행을 위한 main
	 */
	public static void main(String[] args) throws Exception {
		QueryServiceTestNamedParamVO queryTest = new QueryServiceTestNamedParamVO();
		// 1. initialize context
		queryTest.setup();
		// 2. testInsertCategory;
		CategoryVO categoryVO = queryTest.testInsertCategory();
		// 3. testFindCategory;
		queryTest.testFindCategory(categoryVO.getCategoryNo(), categoryVO
				.getCategoryName());
		// 4. testUpdateCategory;
		queryTest.testUpdateCategory(categoryVO);
		// 5. testDeleteCategory;
		queryTest.testDeleteCategory(categoryVO);
		// 6. close context
		queryTest.teardown();

		System.out.println("Successful!!!!!");
	}

	protected void setup() {
		super.setup();
		try {
			testInit();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 테스트 수행을 위한 table 초기화
	 */
	public void testInit() throws Exception {
		IQueryService queryService = (IQueryService) context
				.getBean("queryService");

		try {
			queryService.updateBySQL("DROP TABLE TBL_EXT_CATEGORY",
					new String[] {}, new Object[] {});
		} catch (Exception e) {
			System.out.println("Fail to DROP Table.");
		}

		queryService.updateBySQL("CREATE TABLE TBL_EXT_CATEGORY("
				+ "CATEGORY_NO VARCHAR(16) NOT NULL,"
				+ "CATEGORY_NAME VARCHAR(50) NOT NULL,"
				+ "CATEGORY_DESC VARCHAR(100)," + "USE_YN CHAR(1),"
				+ "REG_ID VARCHAR(20)," + "REG_DATE DATE,"
				+ "MODIFY_ID VARCHAR(20)," + "MODIFY_DATE DATE,"
				+ "CONSTRAINT PK_EXT_CATEGORY PRIMARY KEY(CATEGORY_NO))",
				new String[] {}, new Object[] {});

		queryService
				.updateBySQL(
						"INSERT INTO TBL_EXT_CATEGORY VALUES('CATEGORY-00001','ygt',"
								+ "'electronics','Y',NULL,'2007-06-27',NULL,'2008-05-21')",
						new String[] {}, new Object[] {});
	}

	/**
	 * QueryService에 특정 쿼리의 입력 Parameter값을 전달할 때, named parameter 형태로 transfer
	 * object를 전달한다. QueryService에서는 전달받은 객체의 getter 메소드를 호출하여 INSERT 쿼리문의
	 * Parameter값을 셋팅하고 실행한다.
	 */
	public CategoryVO testInsertCategory() throws Exception {
		IQueryService queryService = (IQueryService) context
				.getBean("queryService");

		CategoryVO categoryVO = makeCategoryVO();

		Object[] args = new Object[] { "vo", categoryVO };
		int result = queryService.create("insertCategory",
				new Object[] { args });

		if (result != 1) {
			throw new Exception("Insert a new category failed");
		}

		return categoryVO;
	}

	/**
	 * QueryService에 특정 쿼리의 입력 Parameter값을 전달할 때, named parameter 형태로 transfer
	 * object를 전달한다. QueryService에서는 전달받은 객체의 getter 메소드를 호출하여 UPDATE 쿼리문의
	 * Parameter값을 셋팅하고 실행한다.
	 */
	public void testUpdateCategory(CategoryVO categoryVO) throws Exception {
		IQueryService queryService = (IQueryService) context
				.getBean("queryService");
		categoryVO.setCategoryName("testUpdate");

		Object[] args = new Object[] { "vo", categoryVO };
		int result = queryService.update("updateCategory",
				new Object[] { args });

		if (result != 1) {
			throw new Exception("Update category failed");
		}
	}

	/**
	 * QueryService에 특정 쿼리의 입력 Parameter값을 전달할 때, named parameter 형태로 transfer
	 * object를 전달한다. QueryService에서는 전달받은 객체의 getter 메소드를 호출하여 DELETE 쿼리문의
	 * Parameter값을 셋팅하고 실행한다.
	 */
	public void testDeleteCategory(CategoryVO categoryVO) throws Exception {
		IQueryService queryService = (IQueryService) context
				.getBean("queryService");

		Object[] args = new Object[] { "vo", categoryVO };
		int result = queryService.remove("deleteCategory",
				new Object[] { args });

		if (result != 1) {
			throw new Exception("Delete category failed");
		}

		args = new Object[] { "vo", categoryVO };
		Collection rtCollection = queryService.find("findCategory",
				new Object[] { args });

		if (rtCollection.size() != 0) {
			throw new Exception("Find categorylist failed");
		}
	}

	/**
	 * QueryService에 특정 쿼리의 입력 Parameter값을 전달할 때, named parameter 형태로 transfer
	 * object를 전달한다. QueryService에서는 전달받은 객체의 getter 메소드를 호출하여 SELECT 쿼리문의
	 * Parameter값을 셋팅하고 실행한다.
	 */
	public void testFindCategory(String categoryNo, String categoryName)
			throws Exception {
		IQueryService queryService = (IQueryService) context
				.getBean("queryService");

		CategoryVO searchVO = new CategoryVO();
		searchVO.setCategoryNo(categoryNo);

		Object[] args = new Object[] { "vo", searchVO };
		Collection rtCollection = queryService.find("findCategory",
				new Object[] { args });

		if (rtCollection.size() != 1) {
			throw new Exception("Find category failed");
		}

		CategoryVO categoryVO = (CategoryVO) rtCollection.iterator().next();
		if (!(categoryNo.equals(categoryVO.getCategoryNo()) && categoryName
				.equals(categoryVO.getCategoryName()))) {
			throw new Exception("Find category failed");
		}
	}

	/**
	 * 테스트 수행을 위한 CategoryVO를 생성하여 전달한다.
	 * 
	 * @return CategoryVO
	 */
	private CategoryVO makeCategoryVO() {
		CategoryVO categoryVO = new CategoryVO();
		categoryVO.setCategoryNo("categoryNo");
		categoryVO.setCategoryName("elec");
		categoryVO.setCategoryDesc("abc");
		categoryVO.setUseYn("y");
		categoryVO.setRegId("abc233");
		categoryVO.setRegDate(null);
		categoryVO.setModifyId("jkl");
		categoryVO.setModifyDate(null);

		return categoryVO;
	}

	protected String[] getConfigLocations() {
		return new String[] {
				"classpath*:/common/applicationContext-*.xml",
				"classpath*:/services/datasource/applicationContext-datasource-common.xml",
				"classpath*:/services/query/applicationContext-query-common.xml",
				"classpath*:/services/query/applicationContext-query-sqlloader.xml" };
	}
}

