/*
* Copyright 2004-2009 the original author or authors.
*
* 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.compass.core.mapping.json;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.compass.core.mapping.AliasMapping;
import org.compass.core.mapping.Mapping;
import org.compass.core.mapping.MappingException;
import org.compass.core.mapping.ResourcePropertyMapping;
import org.compass.core.mapping.support.AbstractResourceMapping;
/**
* @author kimchy
*/
public class RootJsonObjectMapping extends AbstractResourceMapping implements JsonObjectMapping {
private ResourcePropertyMapping[] resourcePropertyMappings;
private Map<String, ResourcePropertyMapping> resourcePropertyMappingsByPath = new HashMap<String, ResourcePropertyMapping>();
private JsonContentMapping contentMapping;
private String fullPath;
private boolean dynamic = false;
private Naming dynamicNaming; // can be null, which means its not set
public Mapping copy() {
RootJsonObjectMapping copy = new RootJsonObjectMapping();
super.copy(copy);
copy.setFullPath(getFullPath());
copy.setDynamic(isDynamic());
copy.setDynamicNaming(getDynamicNaming());
return copy;
}
public AliasMapping shallowCopy() {
RootJsonObjectMapping copy = new RootJsonObjectMapping();
super.shallowCopy(copy);
copy.setFullPath(getFullPath());
copy.setDynamic(isDynamic());
copy.setDynamicNaming(getDynamicNaming());
return copy;
}
public String getFullPath() {
return fullPath;
}
public void setFullPath(String fullPath) {
this.fullPath = fullPath;
}
public boolean isDynamic() {
return dynamic;
}
public void setDynamic(boolean dynamic) {
this.dynamic = dynamic;
}
public Naming getDynamicNaming() {
return dynamicNaming;
}
public void setDynamicNaming(Naming dynamicNaming) {
this.dynamicNaming = dynamicNaming;
}
public int addMapping(Mapping mapping) {
// no duplicate mapping names are allowed
// if (mapping instanceof ResourcePropertyMapping) {
// ResourcePropertyMapping resourcePropertyMapping = (ResourcePropertyMapping) mapping;
// if (mappingsByNameMap.get(resourcePropertyMapping.getName()) != null) {
// if (!(resourcePropertyMapping instanceof OverrideByNameMapping) ||
// !((OverrideByNameMapping) resourcePropertyMapping).isOverrideByName()) {
// throw new InvalidMappingException("Two resource property mappings are mapped to property path ["
// + resourcePropertyMapping.getPath().getPath() + "], it is not allowed");
// }
// }
// }
if (mapping instanceof JsonContentMapping) {
contentMapping = (JsonContentMapping) mapping;
}
return super.addMapping(mapping);
}
protected void doPostProcess() throws MappingException {
ResourcePropertyMappingGatherer resourcePropertyMappingGatherer = new ResourcePropertyMappingGatherer();
JsonMappingIterator.iterateMappings(resourcePropertyMappingGatherer, this, true);
resourcePropertyMappings = resourcePropertyMappingGatherer.getResourcePropertyMappings();
for (ResourcePropertyMapping m : resourcePropertyMappings) {
if (m.isInternal()) {
continue;
}
if (m instanceof JsonMapping) {
JsonMapping jsonMapping = (JsonMapping) m;
resourcePropertyMappingsByPath.put(jsonMapping.getFullPath(), m);
}
}
}
public ResourcePropertyMapping[] getResourcePropertyMappings() {
return resourcePropertyMappings;
}
public ResourcePropertyMapping getResourcePropertyMappingByDotPath(String path) {
return resourcePropertyMappingsByPath.get(path);
}
public JsonContentMapping getContentMapping() {
return this.contentMapping;
}
private class ResourcePropertyMappingGatherer implements JsonMappingIterator.JsonMappingCallback {
private ArrayList<ResourcePropertyMapping> resourcePropertyMappings = new ArrayList<ResourcePropertyMapping>();
public ResourcePropertyMapping[] getResourcePropertyMappings() {
return resourcePropertyMappings.toArray(new ResourcePropertyMapping[resourcePropertyMappings.size()]);
}
public void onJsonRootObject(RootJsonObjectMapping jsonObjectMapping) {
}
public void onJsonObject(PlainJsonObjectMapping jsonObjectMapping) {
}
public void onJsonContent(JsonContentMapping jsonContentMapping) {
}
public void onJsonProperty(JsonPropertyMapping jsonPropertyMapping) {
resourcePropertyMappings.add(jsonPropertyMapping);
}
public void onJsonArray(JsonArrayMapping jsonArrayMapping) {
}
public boolean onBeginMultipleMapping(JsonMapping mapping) {
return true;
}
public void onEndMultipleMapping(JsonMapping mapping) {
}
}
}