001// Copyright 2004, 2005 The Apache Software Foundation 002// 003// Licensed under the Apache License, Version 2.0 (the "License"); 004// you may not use this file except in compliance with the License. 005// You may obtain a copy of the License at 006// 007// http://www.apache.org/licenses/LICENSE-2.0 008// 009// Unless required by applicable law or agreed to in writing, software 010// distributed under the License is distributed on an "AS IS" BASIS, 011// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 012// See the License for the specific language governing permissions and 013// limitations under the License. 014 015package org.apache.hivemind.service.impl; 016 017import java.util.HashMap; 018import java.util.Map; 019 020import org.apache.hivemind.ApplicationRuntimeException; 021import org.apache.hivemind.ErrorLog; 022import org.apache.hivemind.HiveMind; 023import org.apache.hivemind.Location; 024import org.apache.hivemind.internal.Module; 025import org.apache.hivemind.schema.Translator; 026import org.apache.hivemind.service.ObjectProvider; 027 028/** 029 * Implementation of the indirect translator. This translator allows the contributor, not the 030 * schema, to define where object values come from, and is fully extensible. Perhaps I'll have an 031 * inspiration and find a better name than "indirect". 032 * 033 * @author Howard Lewis Ship 034 */ 035public class ObjectTranslator implements Translator 036{ 037 /** @since 1.1 */ 038 private ErrorLog _errorLog; 039 040 /** 041 * Keyed on prefix, value is an {@link org.apache.hivemind.service.ObjectProvider}. 042 */ 043 private Map _providers = new HashMap(); 044 045 public Object translate(Module contributingModule, Class propertyType, String inputValue, 046 Location location) 047 { 048 if (HiveMind.isBlank(inputValue)) 049 return null; 050 051 int colonx = inputValue.indexOf(':'); 052 053 if (colonx < 1) 054 { 055 _errorLog.error(ServiceMessages.invalidProviderSelector(inputValue), null, null); 056 057 return null; 058 } 059 060 String prefix = inputValue.substring(0, colonx); 061 062 ObjectProvider provider = (ObjectProvider) _providers.get(prefix); 063 064 if (provider == null) 065 { 066 _errorLog.error(ServiceMessages.unknownProviderPrefix(prefix), location, null); 067 068 return null; 069 } 070 071 String locator = inputValue.substring(colonx + 1); 072 073 try 074 { 075 return provider.provideObject(contributingModule, propertyType, locator, location); 076 } 077 catch (Exception ex) 078 { 079 throw new ApplicationRuntimeException(ex.getMessage(), location, ex); 080 } 081 082 } 083 084 public void setContributions(Map map) 085 { 086 _providers = map; 087 } 088 089 /** @since 1.1 */ 090 public void setErrorLog(ErrorLog errorLog) 091 { 092 _errorLog = errorLog; 093 } 094}