All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.bval.xml.XMLMetaBeanBuilder Maven / Gradle / Ivy

There is a newer version: 1.1.2
Show newest version
/*
 *  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.bval.xml;

import org.apache.bval.IntrospectorMetaBeanFactory;
import org.apache.bval.MetaBeanBuilder;
import org.apache.bval.MetaBeanFactory;
import org.apache.bval.model.MetaBean;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * Description: 
* User: roman.stumm
* Date: 17.06.2010
* Time: 10:10:46
*/ public class XMLMetaBeanBuilder extends MetaBeanBuilder { private XMLMetaBeanFactory xmlFactory; public XMLMetaBeanBuilder(MetaBeanFactory[] factories) { setFactories(factories); } public XMLMetaBeanBuilder() { setFactories(new MetaBeanFactory[] { new IntrospectorMetaBeanFactory(), new XMLMetaBeanFactory() }); } public void setFactories(MetaBeanFactory[] factories) { super.setFactories(factories); updateXmlFactory(); } public void addLoader(XMLMetaBeanLoader loader) { assertXmlFactory(); xmlFactory.addLoader(loader); } public MetaBean buildForId(String beanInfoId) throws Exception { final XMLMetaBeanFactory.Visitor v; assertXmlFactory(); xmlFactory.visitXMLBeanMeta(beanInfoId, v = new XMLMetaBeanFactory.Visitor() { private MetaBean meta; public MetaBean getMetaBean() { return meta; } public void visit(XMLMetaBean xmlMeta, XMLMetaBeanInfos xmlInfos) throws Exception { if (meta == null) { meta = createMetaBean(xmlMeta); } xmlFactory.enrichMetaBean(meta, new XMLMetaBeanFactory.XMLResult(xmlMeta, xmlInfos)); } }); if (v.getMetaBean() == null) { throw new IllegalArgumentException("MetaBean " + beanInfoId + " not found"); } return v.getMetaBean(); } public Map buildAll() throws Exception { final Map all = super.buildAll(); if (xmlFactory != null) { xmlFactory.visitXMLBeanMeta(null, new XMLMetaBeanFactory.Visitor() { public void visit(XMLMetaBean empty, XMLMetaBeanInfos xmlInfos) throws Exception { if (xmlInfos.getBeans() == null) return; // empty file, ignore XMLMetaBeanFactory.XMLResult carrier = new XMLMetaBeanFactory.XMLResult(null, xmlInfos); for (XMLMetaBean xmlMeta : xmlInfos.getBeans()) { MetaBean meta = all.get(xmlMeta.getId()); if (meta == null) { meta = createMetaBean(xmlMeta); all.put(xmlMeta.getId(), meta); } carrier.xmlMeta = xmlMeta; xmlFactory.enrichMetaBean(meta, carrier); } } public MetaBean getMetaBean() { return null; // do nothing } }); } return all; } public Map enrichCopies(Map all, XMLMetaBeanInfos... infosArray) throws Exception { assertXmlFactory(); final Map copies = new HashMap(all.size()); boolean nothing = true; XMLMetaBeanFactory.XMLResult carrier = new XMLMetaBeanFactory.XMLResult(); for (XMLMetaBeanInfos xmlMetaBeanInfos : infosArray) { carrier.xmlInfos = xmlMetaBeanInfos; if (xmlMetaBeanInfos == null) continue; try { for (XMLMetaBean xmlMeta : xmlMetaBeanInfos.getBeans()) { nothing = false; MetaBean copy = copies.get(xmlMeta.getId()); if (copy == null) { // ist noch nicht kopiert MetaBean meta = all.get(xmlMeta.getId()); if (meta == null) { // gibt es nicht copy = createMetaBean(xmlMeta); } else { // gibt es, jetzt kopieren copy = meta.copy(); } copies.put(xmlMeta.getId(), copy); } carrier.xmlMeta = xmlMeta; xmlFactory.enrichMetaBean(copy, carrier); } } catch (IOException e) { xmlFactory.handleLoadException(xmlMetaBeanInfos, e); } } if (nothing) return all; for (Map.Entry entry : all.entrySet()) { /* * alle unveraenderten werden AUCH KOPIERT (nur zwar nur, wegen * potentieller CrossReferenzen durch Relationships) */ if (!copies.containsKey(entry.getKey())) { if (entry.getValue().hasRelationships()) { copies.put(entry.getKey(), (MetaBean) entry.getValue().copy()); } else { // no relationship: do not clone() copies.put(entry.getKey(), entry.getValue()); } } } return copies; } private MetaBean createMetaBean(XMLMetaBean xmlMeta) throws Exception { return buildForClass(findLocalClass(xmlMeta.getImpl())); } private void updateXmlFactory() { for (MetaBeanFactory each : getFactories()) { if (each instanceof XMLMetaBeanFactory) { // use the first one! xmlFactory = (XMLMetaBeanFactory) each; return; } } xmlFactory = null; // none } public XMLMetaBeanFactory getXmlFactory() { return xmlFactory; } private void assertXmlFactory() { if (xmlFactory == null) { throw new IllegalStateException("no xmlFactory available"); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy