/*
* � Copyright IBM Corp. 2011
*
* 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.ibm.domino.services.content;
import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;
import java.util.Vector;
import lotus.domino.Database;
import lotus.domino.DateTime;
import lotus.domino.Document;
import lotus.domino.DocumentCollection;
import lotus.domino.NotesException;
import com.ibm.domino.services.ServiceException;
import com.ibm.domino.services.rest.RestParameterConstants;
import com.ibm.domino.services.rest.RestServiceConstants;
import com.ibm.domino.services.util.JsonWriter;
import static com.ibm.domino.services.rest.RestServiceConstants.ITEM_FLAGS;
public class JsonViewCollectionContent extends JsonContent {
private static final String FIELD_TITLE = "$TITLE"; //$NON-NLS-1$
private final static char DESIGN_FLAG_FOLDER_VIEW = 'F'; //VIEW: This is a V4 folder view. //$NON-NLS-1$
private final static char DESIGN_FLAG_PRIVATE_IN_DB = 'V'; //ALL: This is a private element stored in the database //$NON-NLS-1$
private final static char DESIGN_FLAG_SHARED_COL = '^'; //VIEW: shared column design element //$NON-NLS-1$
private final static char DESIGN_FLAG_VIEWMAP = 'G'; //VIEW: This is ViewMap/GraphicView/Navigator //$NON-NLS-1$
//View Folder collection constants
private static final String ATTR_FOLDER = "@folder"; //$NON-NLS-1$
private static final String ATTR_PRIVATE = "@private"; //$NON-NLS-1$
private static final String RESOURCE_PATH_DELIM = "/"; //$NON-NLS-1$
private static final String VIEW_RESOURCE_PATH = RestParameterConstants.PARAM_UNID + RESOURCE_PATH_DELIM; //$NON-NLS-1$
private Database _database;
private String _uri;
public JsonViewCollectionContent(Database database, String uri) {
_database = database;
_uri = uri;
}
public void writeViewCollection(JsonWriter jwriter) throws ServiceException {
try {
jwriter.startArray();
DocumentCollection viewsColl = _database.getModifiedDocuments( null, Database.DBMOD_DOC_VIEW );
Document viewDoc = viewsColl.getFirstDocument();
while (viewDoc != null) {
try {
String flags = viewDoc.getItemValueString(ITEM_FLAGS);
DateTime lastModified = viewDoc.getLastModified();
String vname = getViewName(viewDoc);
String unid = viewDoc.getUniversalID();
if (!isView(flags, vname, unid)) {
continue;
}
jwriter.startArrayItem();
writeEntry(jwriter, flags, vname, unid, lastModified);
jwriter.endArrayItem();
} finally {
Document d = viewDoc;
viewDoc = viewsColl.getNextDocument(viewDoc);
d.recycle();
}
}
} catch (NotesException e) {
throw new ServiceException(e,"");
} catch (IOException e) {
throw new ServiceException(e,"");
} finally {
try {
jwriter.endArray();
jwriter.flush();
} catch (IOException e) {
// TODO: Log this
}
}
}
protected void writeEntry(JsonWriter jwriter, String flags, String vname,
String unid, DateTime lastModified) throws IOException, ServiceException {
boolean folder = flags.indexOf( DESIGN_FLAG_FOLDER_VIEW ) >= 0;
boolean privateInDb = flags.indexOf( DESIGN_FLAG_PRIVATE_IN_DB ) >= 0;
jwriter.startObject();
try {
writeProperty(jwriter, RestServiceConstants.ATTR_TITLE, vname);
writeProperty(jwriter, ATTR_FOLDER, folder);
writeProperty(jwriter, ATTR_PRIVATE, privateInDb);
if (lastModified != null)
writeDominoProperty(jwriter, RestServiceConstants.ATTR_MODIFIED,lastModified);
writeProperty(jwriter, RestServiceConstants.ATTR_UNID, unid);
String adddelim = (_uri.endsWith(RESOURCE_PATH_DELIM)) ? "" : RESOURCE_PATH_DELIM;
String link = _uri + adddelim + VIEW_RESOURCE_PATH + unid;
writeProperty(jwriter, RestServiceConstants.ATTR_HREF, link);
} finally {
jwriter.endObject();
}
}
private String getViewName(Document viewDoc) throws NotesException {
String name = "";
String[] aliases = null;
Vector<?> names = viewDoc.getItemValue(FIELD_TITLE);
if ( names != null && names.size() > 0 ){
String title = (String)names.get( 0 );
//Compute the aliases
ArrayList<String> aliasesList = new ArrayList<String>();
StringTokenizer st = new StringTokenizer( title, "|");
while ( st.hasMoreTokens() ){
if ( name == null ){
name = st.nextToken().trim();
}else{
aliasesList.add( st.nextToken().trim() );
}
}
for ( int i = 1; i < names.size(); i++ ){
aliasesList.add( (String)names.get( i ) );
}
aliases = aliasesList.toArray( new String[0] );
}else if ( viewDoc.hasItem( FIELD_TITLE ) ) {
name=""; //Empty name
}
if (name.length() == 0)
if (aliases != null)
name = aliases[0];
return name;
}
/**
* @param flags
* @param unid
* @param vname
* @return
*/
private boolean isView(String flags, String name, String unid) {
if (((name == null) || (name.length() == 0)) && ((unid == null) || (unid.length() == 0))) {
//System.out.println("View has no name/alias or unid");
return false;
}
if ( flags == null ){
return true;
}
return flags.indexOf( DESIGN_FLAG_SHARED_COL ) < 0 &&
//flags.indexOf( DESIGN_FLAG_CALENDAR_VIEW ) < 0 &&
flags.indexOf( DESIGN_FLAG_VIEWMAP ) < 0
;
}
}