/* $Id: SortOrder.java 988245 2010-08-23 18:39:35Z kwright $ */ /** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 org.apache.manifoldcf.crawler.interfaces; import org.apache.manifoldcf.core.interfaces.*; import java.util.*; /** Class which describes specification of the sort order for a report. */ public class SortOrder { public static final String _rcsid = "@(#)$Id: SortOrder.java 988245 2010-08-23 18:39:35Z kwright $"; /** Sort ascending */ public static final int SORT_ASCENDING = 0; /** Sort descending */ public static final int SORT_DESCENDING = 1; /** The sort order list. This is an array of SortSpec objects */ protected ArrayList sortList = new ArrayList(); /** Constructor. */ public SortOrder() { } /** Constructor from string representation. */ public SortOrder(String rep) throws ManifoldCFException { ParseBuffer pb = new ParseBuffer(rep); StringBuilder numBuffer = new StringBuilder(); while (true) { int x = pb.peekCharAt(); if (x == -1) throw new ManifoldCFException("Unexpected end"); char y = (char)x; pb.next(); if (y == ':') break; numBuffer.append(y); } try { int numCount = Integer.parseInt(numBuffer.toString()); int i = 0; while (i < numCount) { SortSpec ss = new SortSpec(pb); sortList.add(ss); i++; } } catch (NumberFormatException e) { throw new ManifoldCFException("Bad number",e); } } /** Convert to string form. */ public String toString() { StringBuilder output = new StringBuilder(); output.append(Integer.toString(sortList.size())); output.append(":"); int i = 0; while (i < sortList.size()) { SortSpec ss = (SortSpec)sortList.get(i++); output.append(ss.toString()); } return output.toString(); } /** Click a column. */ public void clickColumn(String columnName) { int findIndex = -1; int i = 0; while (i < sortList.size()) { SortSpec ss = (SortSpec)sortList.get(i); if (ss.getColumn().equals(columnName)) findIndex = i; i++; } if (findIndex == -1) addCriteria(columnName,SORT_ASCENDING); else { if (findIndex == 0) { // Flip the sort order of the first entry SortSpec ss = (SortSpec)sortList.get(findIndex); sortList.remove(findIndex); addCriteria(columnName,(ss.getDirection()==SORT_ASCENDING)?SORT_DESCENDING:SORT_ASCENDING); } else { // Just move it around to the front SortSpec ss = (SortSpec)sortList.remove(findIndex); sortList.add(0,ss); } } } /** Add a sort criteria, at the front. */ public void addCriteria(String columnName, int order) { sortList.add(0,new SortSpec(columnName,order)); } /** Get the sort spec count. */ public int getCount() { return sortList.size(); } /** Return an individual sort column. */ public String getColumn(int i) { return ((SortSpec)sortList.get(i)).getColumn(); } /** Return an individual direction. */ public int getDirection(int i) { return ((SortSpec)sortList.get(i)).getDirection(); } public static class ParseBuffer { protected String value; protected int startPosition; public ParseBuffer(String value) { this.value = value; startPosition = 0; } public int peekCharAt() { if (startPosition == value.length()) return -1; return (int)value.charAt(startPosition); } public void next() { if (startPosition < value.length()) startPosition++; } } public static class SortSpec { protected String column; protected int direction; public SortSpec(String column, int direction) { this.column = column; this.direction = direction; } public SortSpec(ParseBuffer pb) throws ManifoldCFException { int x = pb.peekCharAt(); if (x == -1) throw new ManifoldCFException("Unexpected end"); char y = (char)x; if (y == '+') this.direction = SORT_ASCENDING; else if (y == '-') this.direction = SORT_DESCENDING; else throw new ManifoldCFException("Bad direction"); pb.next(); StringBuilder sb = new StringBuilder(); while (true) { x = pb.peekCharAt(); if (x == -1) throw new ManifoldCFException("Unexpected end"); y = (char)x; pb.next(); if (y == '.') break; sb.append(y); } column = sb.toString(); } public String getColumn() { return column; } public int getDirection() { return direction; } public String toString() { StringBuilder output = new StringBuilder(); if (direction == SORT_ASCENDING) output.append("+"); else output.append("-"); output.append(column).append("."); return output.toString(); } } }