/** * 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 com.facebook.infrastructure.db; import java.util.HashMap; import java.util.Map; import java.util.StringTokenizer; /** * Author : Avinash Lakshman ( alakshman@facebook.com) & Prashant Malik ( pmalik@facebook.com ) */ abstract class AbstractColumnFactory { private static Map<String, AbstractColumnFactory> columnFactory_ = new HashMap<String, AbstractColumnFactory>(); static { columnFactory_.put(ColumnFamily.getColumnType("Standard"),new ColumnFactory()); columnFactory_.put(ColumnFamily.getColumnType("Super"),new SuperColumnFactory()); } static AbstractColumnFactory getColumnFactory(String columnType) { /* Create based on the type required. */ if ( columnType == null || columnType.equals("Standard") ) return columnFactory_.get("Standard"); else return columnFactory_.get("Super"); } public abstract IColumn createColumn(); public abstract IColumn createColumn(String name); public abstract IColumn createColumn(String name, byte[] value); public abstract IColumn createColumn(String name, byte[] value, long timestamp); public abstract IColumn createColumn(String name, byte[] value, long timestamp, boolean deleted); public abstract ICompactSerializer2<IColumn> createColumnSerializer(); } class ColumnFactory extends AbstractColumnFactory { public IColumn createColumn() { throw new UnsupportedOperationException("Simple column name must not be empty"); } public IColumn createColumn(String name) { return new Column(name); } public IColumn createColumn(String name, byte[] value) { return new Column(name, value); } public IColumn createColumn(String name, byte[] value, long timestamp) { return new Column(name, value, timestamp); } public IColumn createColumn(String name, byte[] value, long timestamp, boolean deleted) { return new Column(name, value, timestamp, deleted); } public ICompactSerializer2<IColumn> createColumnSerializer() { return Column.serializer(); } } class SuperColumnFactory extends AbstractColumnFactory { static String[] getSuperColumnAndColumn(String cName) { StringTokenizer st = new StringTokenizer(cName, ":"); String[] values = new String[st.countTokens()]; int i = 0; while ( st.hasMoreElements() ) { values[i++] = (String)st.nextElement(); } return values; } public IColumn createColumn() { return new SuperColumn(); } public IColumn createColumn(String name) { String[] values = SuperColumnFactory.getSuperColumnAndColumn(name); if ( values.length == 0 || values.length > 2 ) throw new IllegalArgumentException("Super Column " + name + " in invalid format. Must be in <super column name>:<column name> format."); IColumn superColumn = new SuperColumn(values[0]); if(values.length == 2) { IColumn subColumn = new Column(values[1]); superColumn.addColumn(values[1], subColumn); } return superColumn; } public IColumn createColumn(String name, byte[] value) { return createColumn(name, value, 0); } public IColumn createColumn(String name, byte[] value, long timestamp) { return createColumn(name, value, timestamp, false); } public IColumn createColumn(String name, byte[] value, long timestamp, boolean deleted) { String[] values = SuperColumnFactory.getSuperColumnAndColumn(name); if ( values.length != 2 ) throw new IllegalArgumentException("Super Column " + name + " in invalid format. Must be in <super column name>:<column name> format."); IColumn superColumn = new SuperColumn(values[0]); IColumn subColumn = new Column(values[1], value, timestamp, deleted); superColumn.addColumn(values[1], subColumn); return superColumn; } public ICompactSerializer2<IColumn> createColumnSerializer() { return SuperColumn.serializer(); } }