SVN 사용 중에.. "Head... 뭐라뭐라" 메시지 나오면서 커밋 등등 작동 안 하는 문제가 발생할때가 있다..(아주 간혹)

- 메시지를 적어놨어야 하는데.. 안 적어놨다..


이런 경우 최종 Commit 할때 무언가 꼬인 경우기 때문에 최종 이전 버전으로 되돌려 놓으면 해결 된다.


1. ../../"svn home"/"Repositories Name"/db/current     - 현재 최종 버전 정보를 가지고 있는 설정 파일

2. ../../"svn home"/"Repositories Name"/db/revs         - 하위 디렉토리에 Revision 정보들이 파일로 존재


2번 디렉토리에서 제일큰 Revision파일(가장 최근 파일)이 문제 시 되는 Revision 입니다.(예를 들어 227)

- 227 이라는 파일을 열어 보시면 대충 어디에서 커밋하다가 꼬인건지 파악 됩니다.

- 227 파일을 삭제(혹시 모르니 mv) 해놓으시고, 1번의 current 파일을 vi로 열어보시면 "227 ??? ???" 이런식으로 227이라는 문자열을 보실 수 있습니다.

이 227이라는 문자열을 그 이전 정보 226으로 고치고, SVN서버 재 시작 하시면 잘 될 것 입니다.

힙메모리 최적화 버튼

Window > Perference > General에 - Show heap status



영어 단어 검사

Window > Prereces > General > Editors > Spellings - Enable spell checking 해제



코드 블럭(펼치고, 닫기)

Window->Preferences->Java(또는 사용언어)->Editor->Folding 해제


소스 및 패키지,함수 위치 정보 에디터 위에 활성화(java)

툴바에 Toggle Breadcrumb


저장 시 라인 마지막 공백 제거(AnyEdit  Tools 사용 할 경우)

Window > Prereces > General > Editors > AnyEdit Tools - Remove trailing whitespace 해제


괄호해제

    Window > Preference > JAVA -> Editor -> Typing - Automatically close 부분 체크 조절








Plugin

JRebel

Subclipse Or Subversive

JadClipse Or JD-Eclipse

AnyEdit Tools - remove white space option unchecked

StartExplorer

devutil

gradle

grep console




경로 참고

Server 설정 정보 및 Build 경로

..\workspace...\.metadata\.plugins\org.eclipse.wst.server.core

Preferences 설정 파일(Font, Keys)

..\workspace...\.metadata\.plugins\org.eclipse.core.runtime\.settings\org.eclipse.ui.workbench.prefs






/**
 * 해당월 주의 최대값
 * @param dateStr		YYYYMM
 */
function getWeekCountOfMonth(dateStr) {
	var year  = Number(dateStr.substring(0, 4));
	var month = Number(dateStr.substring(4, 6));
	
	var nowDate = new Date(year, month-1, 1);

	var lastDate = new Date(year, month, 0).getDate();
	var monthSWeek = nowDate.getDay();

	var weekSeq = parseInt((parseInt(lastDate) + monthSWeek - 1)/7) + 1;

	return weekSeq;
}
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;

import com.ibm.icu.util.Calendar;


public class DateUtil {
	/**
	 * 월의 해당 주의 날짜 배열을 얻어온다.
	 * @param yyyymm
	 * @param weekSeq
	 * @return
	 */
	public static int[] getRangeDateOfWeek(String yyyymm, int weekSeq) {
		int rangeDateOfWeek [] = new int[7];
		
		int startDayOfWeek = dayOfWeek(yyyymm.substring(0, 4), yyyymm.substring(4, 6), "1");
		
		if( startDayOfWeek == 0 || weekSeq > 1 ){
			Calendar cal = converterDate(yyyymm+"01");
			int lastDateOfMonth = getLastDateOfMonth(new SimpleDateFormat("yyyyMM").format(cal.getTime()));
			
			int startDate = 1 + ((weekSeq-1)*7) - startDayOfWeek;
			for( int i=0; i<7; i++ ){
				if( startDate > lastDateOfMonth ){
					startDate = 1;
				}
				rangeDateOfWeek[i] = startDate++;
			}
		}else{
			Calendar cal = converterDate(yyyymm+"01");
			cal.add(Calendar.MONTH, -1);
			int lastDateOfBeforeMonth = getLastDateOfMonth(new SimpleDateFormat("yyyyMM").format(cal.getTime()));
			
			int startDate = (lastDateOfBeforeMonth + 1) - startDayOfWeek;
			for( int i=0; i<7; i++ ){
				if( startDate > lastDateOfBeforeMonth ){
					startDate = 1;
				}				
				rangeDateOfWeek[i] = startDate++;
			}
		}
		return rangeDateOfWeek;
	}
	/**
	 * 특정날짜의  요일의 숫자를 리턴
	 * 0:일요일 ~ 6:토요일
	 * @return
	 */
	public static int dayOfWeek(String sYear, String sMonth, String sDay) {		
		
		int iYear = Integer.parseInt(sYear);
		int iMonth = Integer.parseInt(sMonth) - 1;
		int isDay = Integer.parseInt(sDay);
		
		GregorianCalendar gc = new GregorianCalendar(iYear, iMonth, isDay); 

		return gc.get(gc.DAY_OF_WEEK) - 1;				
	}
	
	/**
	 * String 형식의 날자를 Calendar 로 변환 해준다.
	 * 
	 * @param yyyymmdd
	 * @return
	 */
	public static Calendar converterDate(String yyyymmdd) {
		Calendar cal = Calendar.getInstance(); // 양력 달력
		if (yyyymmdd == null)
			return cal;

		String date = yyyymmdd.trim();
		if (date.length() != 8) {
			if (date.length() == 4)
				date = date + "0101";
			else if (date.length() == 6)
				date = date + "01";
			else if (date.length() > 8)
				date = date.substring(0, 8);
			else
				return cal;
		}

		cal.set(Calendar.YEAR, Integer.parseInt(date.substring(0, 4)));
		cal.set(Calendar.MONTH, Integer.parseInt(date.substring(4, 6)) - 1);
		cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(date.substring(6)));

		return cal;
	}
	
	/**
	 * 해당 월의 마지막일을 구한다.
	 * @return
	 */
	public static int getLastDateOfMonth() {
		return getLastDateOfMonth(new Date());
	}
	public static int getLastDateOfMonth(Date date) {
		return getLastDateOfMonth(new SimpleDateFormat("yyyyMM").format(date));
	}
	public static int getLastDateOfMonth(String yyyymm) {
		int year = Integer.parseInt(yyyymm.substring(0, 4));
		int month = Integer.parseInt(yyyymm.substring(4, 6)) - 1;
		
		Calendar destDate = Calendar.getInstance();
		destDate.set(year, month, 1);
		
		return destDate.getActualMaximum(Calendar.DATE);
	}
}

jQuery(document).bind("mobileinit", function(){
	// 페이지 이동 시 back 버튼 표시 유무(1.7 버전부터는 default 값이 false 인듯)
	jQuery.mobile.page.prototype.options.addBackBtn = true;
	
	// 페이지 이동시 이동효과(기본값 fade | fade, pop, flip, turn, low, slidefade, slid, slideup, sliddown, none)
	jQuery.mobile.defaultPageTransition = "slide";
});
$.mobile.changePage(to, options)
to (string or object, required)
options (object, optional)

ex) (string, options)
$.mobile.changePage( "../alerts/confirm.html", {
transition: "pop", // 이동효과(fade, pop, flip, turn, low, slidefade, slid, slideup, sliddown, none)
reverse: false, // back button 클릭시 이전 페이지 이동 여부(default:false)
changeHash: false // hash 데이터 업데이트 여부
});



import java.io.File;
import java.io.FileInputStream;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.XSSFCell;

/**
 * Excel Read 한다. xls, xlsx 가능
 * ex) 	ExcelGenerator.excelToList(new File("path..xls,xlsx");
 * 		ExcelGenerator.excelToList(new File("path..xls,xlsx", new Integer[]{x, y, width, height});
 * ExcelGenerator.excelToList(new File("path..xls,xlsx", x, y, width, height);
 * 		java.awt.Rectangle(int x, int y, int width, int height) 와 같은 형태로 왼쪽 위 모서리 좌표와, 오른쪽 아래 모서리 좌표 정보 
 * @author 	ddakker
 * @version 1.0
 * @date	2012.05.04
 *
 */
public class ExcelGenerator {
	private static final Log logger = LogFactory.getLog(ExcelGenerator.class);
	
	public static Object[][] excelToList(File file ) throws Exception {
		return excelToList(file, 0, null);
	}
	
	/**
	 * 엑셀 데이터를 Object[colunm][row] 형태로 변환한다.
	 * @param file			엑셀 파일(xls, xlsx)
	 * @param x				왼쪽 위 모서리 x
	 * @param y				왼쪽 위 모서리 y
	 * @param width			오른쪽 아래 모서리 x
	 * @param height		오른쪽 아래 모서리 y
	 * @return
	 * @throws Exception
	 */
	public static Object[][] excelToList(File file, int x, int y, int width, int height) throws Exception {
		Integer [] colRow = {x, y, width, height};
		return excelToList(file, 0, colRow);
	}
	
	/**
	 * 엑셀 데이터를 Object[colunm][row] 형태로 변환한다.
	 * @param file			엑셀 파일(xls, xlsx)
	 * @param colRow		범위 지정 new Integer[]{왼쪽 위 모서리 x, 왼쪽 위 모서리 y, 오른쪽 아래 모서리 x, 오른쪽 아래 모서리 y}
	 * @return
	 * @throws Exception
	 */
	public static Object[][] excelToList(File file, Integer [] colRow) throws Exception {
		return excelToList(file, 0, colRow);
	}
	
	/**
	 * 엑셀 데이터를 Object[colunm][row] 형태로 변환한다.
	 * @param file			엑셀 파일(xls, xlsx)
	 * @param sheetIndex	시트 번호
	 * @return
	 * @throws Exception
	 */
	public static Object[][] excelToList(File file, int sheetIndex) throws Exception {
		return excelToList(file, sheetIndex, null);
	}
	
	/**
	 * 엑셀 데이터를 Object[colunm][row] 형태로 변환한다.
	 * @param file				엑셀 파일(xls, xlsx)
	 * @param sheetIndex		시트 번호
	 * @param colRow			범위 지정 new Integer[]{왼쪽 위 모서리 x, 왼쪽 위 모서리 y, 오른쪽 아래 모서리 x, 오른쪽 아래 모서리 y}
	 * @return
	 */
	public static Object[][] excelToList(File file, int sheetIndex, Integer [] colRow) throws Exception {
		Object [][] contentData = null;
		
		FileInputStream fis			= null;
		Workbook 		workBook	= null;
        Sheet			sheet		= null;
        
        try {
        	if( colRow != null ){
	        	if( colRow.length != 4 )					throw new Exception("colRow[] 무조껀 셋팅 해야 합니다. ex) new Integer[]{0,0,6,2}");
	        	if( !(colRow[0] >= 0 && colRow[1] >= 0) )	throw new Exception("colRow[] 0 이상 입력 하시요. ex) new Integer[]{1,1,6,2}");
	        	if( !(colRow[2] >= 0 && colRow[3] >= 0) )	throw new Exception("colRow[] 0 이상 입력 하시요. ex) new Integer[]{1,1,6,2}");
        	}
        	fis			= new FileInputStream(file);
        	workBook	= WorkbookFactory.create(fis);
    		sheet		= workBook.getSheetAt(sheetIndex);
            
            int minCol = colRow==null?0:colRow[0];
            int maxCol = colRow==null?-1:colRow[2]+1;
            
            int minRow = colRow==null?0:colRow[1];
            int maxRow = colRow==null?sheet.getPhysicalNumberOfRows():colRow[3]+1;
            
            FormulaEvaluator evaluator = workBook.getCreationHelper().createFormulaEvaluator();
            
            for( int i=minRow; i<maxRow; i++ ) {
            	Row row = sheet.getRow(i);
            	if( i-minRow == 0 ){
	            	if( maxCol == -1 ){
	            		maxCol = row.getPhysicalNumberOfCells();
	            	}
	            	contentData = new Object[maxRow-minRow][maxCol-minCol];
            	}
                for( int j=minCol; j<maxCol; j++ ) {
                	Cell cell = row.getCell(j)==null?row.createCell(j):row.getCell(j);
                	
                	Object value = null;
                    switch( cell.getCellType() ) {
                         case XSSFCell.CELL_TYPE_FORMULA :
                        	 if( !(cell.toString() == "") ){
	                             if(evaluator.evaluateFormulaCell(cell)==XSSFCell.CELL_TYPE_NUMERIC){
	                            	 //value = cell.getNumericCellValue();         
	                            	 value = String.valueOf(new Double(cell.getNumericCellValue()).intValue());
	                             }else if(evaluator.evaluateFormulaCell(cell)==XSSFCell.CELL_TYPE_STRING){
	                            	 value = cell.getStringCellValue();
	                             }else if(evaluator.evaluateFormulaCell(cell)==XSSFCell.CELL_TYPE_BOOLEAN){
	                                  value = String.valueOf(cell.getBooleanCellValue());         
	                             }
                        	 }
                        	 break;
                         case XSSFCell.CELL_TYPE_NUMERIC :
                        	 //value = cell.getNumericCellValue();
                        	 value = String.valueOf(new Double(cell.getNumericCellValue()).intValue());
                             break;
                         case XSSFCell.CELL_TYPE_STRING :
                        	 value = cell.getStringCellValue()==null?new String(""):cell.getStringCellValue();
                        	 break;
                         case XSSFCell.CELL_TYPE_BOOLEAN :
                        	 value = Boolean.toString(cell.getBooleanCellValue()); //boolean
                        	 break;
                         default :
                    }
                    
                    logger.debug("xlsx ["+i+"]["+j+"]=" + ((cell==null || value==null)?"":value));
                    contentData[i-minRow][j-minCol] = (value==null)?new String(""):value;
                }
            }
        } catch (Exception e) {
        	logger.error(e);
            throw new Exception("POI Excel Read 중 오류가 발생하였습니다.");
        } finally {
        	if( fis != null ) fis.close();
        }
        return contentData;
    }

    /**
	 * List 데이터를 엑셀 형식으로 변환한다.
	 * 		* String만 테스트 해봄.. 다른 데이터형은 직접 테스트 해보실것!!![2013.08.22]
	 * @param list
	 * @return
	 * @throws Exception
	 * @auther ddakker 2013. 8. 22.
	 */
	public static HSSFWorkbook listToExcel(List> list) throws Exception {
		HSSFWorkbook wb = null;
		try{

			wb = new HSSFWorkbook();
			HSSFRow row = null;
			HSSFCell cell = null;

			HSSFSheet sheet = wb.createSheet();

			wb.setSheetName(0, "Sheet1");
			sheet.setColumnWidth(0, sheet.getDefaultColumnWidth() * 700);
			sheet.setColumnWidth(1, sheet.getDefaultColumnWidth() * 4300);

			HSSFCellStyle titleCellStyle = wb.createCellStyle();
			titleCellStyle.setBorderBottom(HSSFCellStyle.BORDER_THICK);
			titleCellStyle.setBorderLeft(HSSFCellStyle.BORDER_THICK);
			titleCellStyle.setBorderRight(HSSFCellStyle.BORDER_THICK);
			titleCellStyle.setBorderTop(HSSFCellStyle.BORDER_THICK);
			titleCellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
			titleCellStyle.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);

			Iterator it = list.get(0).keySet().iterator();
			int haderIdx = 0;
			HSSFRow titleRow = sheet.createRow(0);
			while (it.hasNext()) {
				String key = it.next();

				cell = titleRow.createCell(haderIdx++);
				cell.setCellValue(key);
				cell.setCellStyle(titleCellStyle);
			}

			HSSFCellStyle contentCellStyle = wb.createCellStyle();
			contentCellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
			contentCellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
			contentCellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
			contentCellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
			contentCellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
			contentCellStyle.setFillForegroundColor(HSSFColor.WHITE.index);

			for( int i=0,size=list.size(); i<size; i++ ){
				row = sheet.createRow((i+1));

				it = list.get(0).keySet().iterator();
				haderIdx = 0;
				while (it.hasNext()) {
					String key = it.next();

					cell = row.createCell(haderIdx++);
					cell.setCellStyle(contentCellStyle);

					if( list.get(i).get(key) instanceof String ) 			cell.setCellValue( (String) list.get(i).get(key) );
					if( list.get(i).get(key) instanceof Integer ) 			cell.setCellValue( (Integer) list.get(i).get(key) );
					if( list.get(i).get(key) instanceof Long ) 				cell.setCellValue( (Long) list.get(i).get(key) );
					if( list.get(i).get(key) instanceof Float ) 			cell.setCellValue( (Float) list.get(i).get(key) );
					if( list.get(i).get(key) instanceof Double ) 			cell.setCellValue( (Double) list.get(i).get(key) );
					if( list.get(i).get(key) instanceof Date ) 				cell.setCellValue( (Date) list.get(i).get(key) );
					if( list.get(i).get(key) instanceof java.sql.Date ) 	cell.setCellValue( (java.sql.Date) list.get(i).get(key) );
				}
			}
		}catch(Exception e){
			logger.error("POI List에서 Excel로 변환 중 오류가 발생하였습니다.");
			logger.error(e);
		}
		return wb;
	}
}

--------------


dom4j-1.6.1.jar

poi-3.6-20091214.jar

poi-ooxml-3.6-20091214.jar

poi-ooxml-schemas-3.6-20091214.jar

xmlbeans-2.3.0.jar

Object -> XML 문자열 변환
아주 간단하게 처리 된다.

import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.betwixt.io.BeanWriter;

public class WriteExampleApp {

    public static final void main(String [] args) throws Exception {

        StringWriter outputWriter = new StringWriter();

        outputWriter.write("");

        BeanWriter beanWriter = new BeanWriter(outputWriter);

        // Bean 속성 으로 값 출력 여부
        beanWriter.getXMLIntrospector().getConfiguration().setAttributesForPrimitives(true);
        // 아이디 출력 여부
        beanWriter.getBindingConfiguration().setMapIDs(false);
        // 정렬
        beanWriter.enablePrettyPrint();

        List list1 = new ArrayList();
        list1.add(new PersonBean("hk", 20));
        list1.add(new PersonBean("dk", 20));

        Map map = null;
        List list2 = new ArrayList();

        map = new HashMap();
        map.put("name", "hk");
        map.put("age", "20");
        list2.add( map );

        map = new HashMap();
        map.put("name", "dk");
        map.put("age", "20");
        list2.add( map );

        beanWriter.write("list1", list1);
        beanWriter.write("list2", list2);

        System.out.println(outputWriter.toString());

        outputWriter.close();
    }
}

[참조] http://commons.apache.org/betwixt/guide/examples.html
 
	public String convertorChar(String value) {
		// \(역슬레쉬) 맨 처음 치환
		return value==null?"":value.replace("\\", "\\\\")
									.replace("+", "\\+")
									.replace("[", "\\[")
									.replace("]","\\]")
									.replace("(", "\\(")
									.replace(")", "\\)")
									.replace("{", "\\{")
									.replace("}", "\\}")
									.replace("\'", "\\\'")
									.replace("\"", "\\\"");
	}

환경 : Struts2 + Spring + Sitemesh 등

기존 개발된 환경에서 Source 는 그대로 유지하면서 MVC Action 단 Result View를 XML, JSON 등의 형태로 받고 싶었다.

아래 아키텍처를 보고 고민하던 중 Result 단을 좀 꺽으면 될듯 싶어 작업해 보았다.

우선 Default Result 인 org.apache.struts2.dispatcher.ServletDispatcherResult 를 상속받아서 doExecute 함수를 재정의 해서 호출확장자가 .action 일때는 기존과 그대로 처리 하고, action.xml, action.json 일때는 request.getAttributeNames() 배열에 있는 데이터를 xml, json 문자열로 만들어서 response.getWriter() 이용해서 출력하면 되겠네요.
(해당 정보를 파라미터로 해도 될듯하고, Request Header 정보를 활용해도 되겠습니닷.)


신경써야 할 점은 getAttribute 배열에 들어있는 불필요한 데이터는 무시합니다.
또한 Struts2 가 POJO 기반이여서 Action 단의 데이터들도 뽑아와야 하는데 파마리터 ActionInvocation 객체에 getAction() 함수를 통해서 얻을 수 있습니다.
(getAttribute에 "struts.valueStack" 에 OgnlValueStack 객체에도 Action  정보가 담겨 있습니다. OgnlValueStack 는 배열로서 해당 Action 객체 일때 필요한 getter 메소드 호출해서 사용하면 되겠습니다.  ActionInvocation  에서 뽑아 올 경우 getAttributeNames() 이용 시  "struts.valueStack" 정보는 제외 시켜야 합니다.)


필요에 따라 다른 ResultType 들도 수정하시면 되겠습니다.

수정 하시고, struts 설정파일 package 하위 result-type 에 등록하시면 되겠습니다.

또한 super.doExceute() 함수에 try ~ catch 거시면 JSP Runtime Exception 에 대한 처리도 할 수 있겠네요.


JSON, XML 변환은 아래 package를 사용했습니다.
ezmorph-1.0.4.jar
json-lib-2.2.1-jdk15.jar
xom-1.1.jar
* 위 jar 최신버전으로 하면 오류나네요...
* 또한 XML Element Name이 숫자로 생성되면 파싱 오류납니다.

 



+ Recent posts