/*
* Copyright 2004-2012 the Seasar Foundation and the Others.
*
* 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 org.seasar.mayaa.impl.builder.library;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.seasar.mayaa.PositionAware;
import org.seasar.mayaa.builder.library.LibraryDefinition;
import org.seasar.mayaa.builder.library.LibraryManager;
import org.seasar.mayaa.builder.library.ProcessorDefinition;
import org.seasar.mayaa.builder.library.PropertySet;
import org.seasar.mayaa.builder.library.converter.PropertyConverter;
import org.seasar.mayaa.engine.specification.URI;
import org.seasar.mayaa.impl.ParameterAwareImpl;
import org.seasar.mayaa.impl.provider.ProviderUtil;
import org.seasar.mayaa.impl.util.StringUtil;
import org.seasar.mayaa.impl.util.collection.NullIterator;
/**
* @author Masataka Kurihara (Gluegent, Inc.)
*/
public class LibraryDefinitionImpl extends ParameterAwareImpl
implements LibraryDefinition {
private static final long serialVersionUID = -2112164511711535994L;
private static final Log LOG =
LogFactory.getLog(LibraryDefinitionImpl.class);
private URI _namespaceURI;
private List _assignedURI = new ArrayList();
private Map _converters;
private Map _propertySets;
private Map _processors;
private String _systemID;
public void setSystemID(String systemID) {
if (StringUtil.isEmpty(systemID)) {
throw new IllegalArgumentException();
}
_systemID = systemID;
}
public String getSystemID() {
return _systemID;
}
public void setNamespaceURI(URI namespaceURI) {
if (StringUtil.isEmpty(namespaceURI)) {
throw new IllegalArgumentException();
}
_namespaceURI = namespaceURI;
}
public URI getNamespaceURI() {
return _namespaceURI;
}
public void addAssignedURI(URI assignedURI) {
if (StringUtil.isEmpty(assignedURI)) {
throw new IllegalArgumentException();
}
if (assignedURI.equals(_namespaceURI) == false
&& _assignedURI.contains(assignedURI) == false) {
_assignedURI.add(assignedURI);
}
}
public Iterator iterateAssignedURI() {
return _assignedURI.iterator();
}
protected void warnAlreadyRegistered(
PositionAware obj, String name, int index) {
if (LOG.isWarnEnabled()) {
String systemID = obj.getSystemID();
String lineNumber = Integer.toString(obj.getLineNumber());
LOG.warn(StringUtil.getMessage(LibraryDefinitionImpl.class, index,
name, systemID, lineNumber));
}
}
public void addPropertyConverter(
String name, PropertyConverter converter) {
if (converter == null) {
throw new IllegalArgumentException();
}
if (StringUtil.isEmpty(name)) {
name = converter.getPropetyClass().getName();
}
if (_converters == null) {
_converters = new HashMap();
}
if (_converters.containsKey(name)) {
warnAlreadyRegistered(converter, name, 1);
} else {
_converters.put(name, converter);
}
}
public PropertyConverter getPropertyConverter(Class propertyClass) {
if (propertyClass == null) {
throw new IllegalArgumentException();
}
if (_converters != null) {
for (Iterator it = _converters.values().iterator(); it.hasNext();) {
PropertyConverter converter = (PropertyConverter) it.next();
if (propertyClass.equals(converter.getPropetyClass())) {
return converter;
}
}
}
LibraryManager manager = ProviderUtil.getLibraryManager();
return manager.getPropertyConverter(propertyClass);
}
public PropertyConverter getPropertyConverter(String converterName) {
if (StringUtil.isEmpty(converterName)) {
throw new IllegalArgumentException();
}
if (_converters != null && _converters.containsKey(converterName)) {
return (PropertyConverter) _converters.get(converterName);
}
LibraryManager manager = ProviderUtil.getLibraryManager();
return manager.getPropertyConverter(converterName);
}
public Iterator iteratePropertyConverters() {
if (_converters == null) {
return NullIterator.getInstance();
}
return _converters.values().iterator();
}
public void addPropertySet(PropertySet propertySet) {
if (propertySet == null) {
throw new IllegalArgumentException();
}
String name = propertySet.getName();
if (_propertySets == null) {
_propertySets = new HashMap();
}
if (_propertySets.containsKey(name)) {
warnAlreadyRegistered(propertySet, name, 2);
} else {
_propertySets.put(name, propertySet);
}
}
public Iterator iteratePropertySets() {
if (_propertySets == null) {
return NullIterator.getInstance();
}
return _propertySets.values().iterator();
}
public PropertySet getPropertySet(String name) {
if (StringUtil.isEmpty(name)) {
throw new IllegalArgumentException();
}
if (_propertySets == null) {
return null;
}
return (PropertySet) _propertySets.get(name);
}
public void addProcessorDefinition(ProcessorDefinition processor) {
if (processor == null) {
throw new IllegalArgumentException();
}
String name = processor.getName();
if (_processors == null) {
_processors = new HashMap();
}
if (_processors.containsKey(name)) {
warnAlreadyRegistered(processor, name, 3);
} else {
_processors.put(name, processor);
}
}
public Iterator iterateProcessorDefinitions() {
if (_processors == null) {
return NullIterator.getInstance();
}
return _processors.values().iterator();
}
public ProcessorDefinition getProcessorDefinition(String name) {
if (StringUtil.isEmpty(name)) {
throw new IllegalArgumentException();
}
if (_processors == null) {
return null;
}
return (ProcessorDefinition) _processors.get(name);
}
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("LibraryDefinition: ");
sb.append("systemID = ");
sb.append(_systemID);
sb.append(", namespaceUrl = ");
sb.append(_namespaceURI);
sb.append(", assignedURI = (");
for (Iterator it = _assignedURI.iterator(); it.hasNext();) {
sb.append(it.next());
sb.append(", ");
}
sb.append("), ");
if (_processors != null) {
sb.append("processors = (");
for (Iterator it = _processors.keySet().iterator(); it.hasNext();) {
String key = (String) it.next();
ProcessorDefinition def = getProcessorDefinition(key);
sb.append(def.getName());
sb.append(" - ");
sb.append(def.getProcessorClass());
sb.append(", ");
}
sb.append("), ");
}
if (_propertySets != null) {
sb.append("propertySets = (");
for (Iterator it = _propertySets.keySet().iterator(); it.hasNext();) {
String key = (String) it.next();
PropertySet prop = getPropertySet(key);
sb.append(prop.getName());
sb.append(" = ");
sb.append(prop.getParameter(prop.getName()));
sb.append(", ");
}
sb.append("), ");
}
return sb.toString();
}
}